#include "remi.h"
#include "ui_remi.h"

Remi::Remi(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Remi)
{
    ui->setupUi(this);

    remitable = new RemiTable();
    ui->remiTableLayout->addWidget(remitable);

    db = QSqlDatabase::database();

    connect(ui->gtin_input, SIGNAL(textChanged(QString)), this, SLOT(add_remi_check()));
    connect(ui->gtin_input, SIGNAL(returnPressed()), this, SLOT(add_remi()));
    connect(ui->addremi_button, SIGNAL(clicked()), this, SLOT(add_remi()));
    connect(remitable, SIGNAL(itemSelectionChanged()), this, SLOT(check_delete()));
    connect(remitable, SIGNAL(tableChanged()), this, SLOT(checkAll()));
    connect(ui->delete_button, SIGNAL(clicked()), remitable, SLOT(removeSelectedRemis()));
    connect(ui->finish_button, SIGNAL(clicked()), this, SLOT(archivieren()));
    connect(ui->newPackage_button, SIGNAL(clicked()), remitable, SLOT(newPackage()));
}

Remi::~Remi()
{
    delete ui;
}

/*========== SLOTS ========== */

void Remi::checkAll()
{
    ui->finish_button->setEnabled( (remitable->getLastEditedRemi())?true:false ); /** Abschließen möglich, sobald mindestens eine Remi existiert **/
    ui->newPackage_button->setEnabled( (remitable->getPaket(-1)->getRemiItems().count()==0)?false:true ); /** neues Paket möglich, sobald mindestens eine Remi im "neuen Paket" ist **/
    check_delete();
    add_remi_check();
    ui->gtin_input->setFocus();
}

bool Remi::add_remi_check()
{
    /** GTIN eingegeben, evtl mit Mengenangabe und Addon-Code **/
    QRegExp rx("^([0-9]{1,3}[x*]{1})?([0-9]{13,18})$");
    if ( ui->gtin_input->text().contains(rx) )
    {
        if ( da.isGTIN( rx.cap(2) ) )
        {
            ui->addremi_button->setText(tr("Hinzufügen"));
            ui->addremi_button->setEnabled(true);
            return true;
        }
    }

    /** Mengenangabe zum ändern der letzten Eingabe **/
    rx.setPattern("^([+-]{1}[0-9]{1,3})[x*]{1}$");
    if ( ( ui->gtin_input->text().isEmpty() || ui->gtin_input->text().contains(rx) ) && remitable->getLastEditedRemi() )
    {
        ui->addremi_button->setText(tr("Letzte Eingabe ändern"));
        ui->addremi_button->setEnabled(true);
        return true;
    }

    /** ToDo: Titel in den Stammdaten suchen **/



    /** Ungültige Eingabe **/
    ui->addremi_button->setText(tr("Eingabe prüfen"));
    ui->addremi_button->setDisabled(true);
    return false;
}

void Remi::add_remi()
{
    if ( add_remi_check() )
    {
        QRegExp addsubrx("^([-+]{1}[0-9]+)[x*]{1}$");

        /** Wenn das Eingabefeld leer ist, dann das letzte Objekt um 1 erhöhen **/
        if ( ui->gtin_input->text().isEmpty() )
        {
            remitable->getLastEditedRemi()->addQuantity(1);
        }

        /** Das letzte Objekt um die eingegebene Anzahl verändern **/
        else if ( ui->gtin_input->text().contains(addsubrx) )
        {
            remitable->getLastEditedRemi()->addQuantity( addsubrx.cap(1).toInt() );
        }

        /** Sonst als neues Objekt zur Remission hinzufügen **/
        else
        {
            QRegExp rx("^(([0-9]{1,3})[x*]{1})?([0-9]{13,18})$");
            if ( ui->gtin_input->text().contains(rx) )
            {
                int menge = (rx.cap(2).toInt()==0)?1:rx.cap(2).toInt(); // Wenn keine Menge angegeben, dann auf 1 setzen
                QString gtin = rx.cap(3).mid(0, 13);
                QString addon = rx.cap(3).mid(13, 5);

                /** Prüfen, ob der Addon-Code eingegeben wurde, falls nicht abfragen, aber nur, wenn es sich um einen PresseGTIN handelt **/
                if ( da.isPresseGTIN(gtin) && addon.isEmpty() )
                {
                    bool ok, isLongLong;
                    do
                    {
                        QSound::play("sounds/noaddon.wav");
                        addon = QInputDialog::getText(this, tr("Addon-Code"), tr("Der Addon-Code wurde nicht gelesen.\r\nDer Addon-Code gibt normalerweise die Ausgabe an.\r\nBitte geben Sie ihn von Hand ein (2 oder 5 Ziffern)\r\noder scannen Sie die Remittende erneut ein:"), QLineEdit::Normal, QString(), &ok);
                        addon.toLongLong(&isLongLong);

                        if ( !isLongLong )
                        {
                            continue;
                        }
                        if ( addon.length() == 2 || addon.length() == 5 )
                        {
                            break;
                        }
                        if ( (addon.length() == 15 || addon.length() == 18) && addon.left(13) == gtin )
                        {
                            addon.remove(0,13);
                            break;
                        }
                    }
                    while ( ok );

                    if ( !ok )
                    {
                        QMessageBox::information(this, tr("Titel hinzufügen"), tr("Der Titel wurde nicht zur aktuellen Remission hinzugefügt."));
                        checkAll();
                        ui->gtin_input->clear();
                        return;
                    }
                }

                QString objektnr = da.getObjektNr(gtin, addon);

                /** Falls es das Objekt noch nicht gibt, Titel abfragen und anlegen **/
                if ( objektnr.isEmpty() )
                {
                    bool ok = true;
                    QString titel;

                    if ( db.isOpen() || db.open() )
                    {
                        QSqlQuery q(db);
                        q.prepare("SELECT objektnr, titel FROM online_sortiment WHERE vdznr = :vdznr;");
                        q.bindValue(":vdznr", da.getVdznr(gtin));
                        if ( q.exec() && q.first() )
                        {
                            objektnr = q.value(0).toString();
                            titel = q.value(1).toString();
                        }
                        else
                        {
                            QSound::play("sounds/newobjct.wav");
                            RemiAddDialog *rad = new RemiAddDialog(this, &objektnr, &titel, gtin);
                            ok = rad->exec();
                        }
                    }


//                    do
//                    {
//                        QSound::play("sounds/newobjct.wav");
//                        titel = QInputDialog::getText(this, tr("Stammdaten hinzufügen"), tr("Diese GTIN ist noch keinem Titel\r\nzugeordnet. Bitte geben Sie den Titel ein:"), QLineEdit::Normal, titel, &ok);
//                        if ( da.isGTIN(titel) || titel.isEmpty() )
//                            QMessageBox::warning(this, tr("Stammdaten hinzufügen"), tr("Bitte geben Sie einen gültigen Titel ein, um mit der Remission fortzufahren."));
//                    }
//                    while ( ok && (da.isGTIN(titel) || titel.isEmpty()) );

                    if ( ok )
                    {
                        float preis = 0;

                        /** Wenn es kein PresseGTIN ist, den Preis abfragen **/
                        if ( !da.isPresseGTIN(gtin) )
                        {
                            bool ok;
                            do
                            {
                                QApplication::beep();
                                double p = QInputDialog::getDouble(this, tr("Stammdaten hinzufügen"), tr("Bitte geben Sie den Preis ein:"), 0, 0, 999.99, 2, &ok);
                                preis = QVariant(p).toFloat();
                            }
                            while ( !ok );
                        }

                        QString multi;
                        if ( addon.length() == 5 && QMessageBox::question(this, tr("Stammdaten hinzufügen"), tr("Handelt es sich um eine Wochenzeitung?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes )
                            multi = addon.left(1);

                        if ( db.isOpen() || db.open() )
                        {
                            QSqlQuery s(db);
                            if ( multi.isEmpty() )
                                s.prepare(QString("INSERT INTO stammdaten (objektnr, %1, titel, preis) VALUES (:objektnr, :vdznrgtin, :titel, :preis);").arg(da.isGTIN(da.getVdznr(gtin))?"gtin":"vdznr"));
                            else
                            {
                                s.prepare(QString("INSERT INTO stammdaten (objektnr, %1, multi, titel, preis) VALUES (:objektnr, :vdznrgtin, :multi, :titel, :preis);").arg(da.isGTIN(da.getVdznr(gtin))?"gtin":"vdznr"));
                                s.bindValue(":multi", multi);
                            }
                            s.bindValue(":objektnr", objektnr);
                            s.bindValue(":vdznrgtin", da.getVdznr(gtin));
                            s.bindValue(":titel", titel);
                            s.bindValue(":preis", preis);
                            s.exec();
                        }
                    }
                    else
                    {
                        QMessageBox::information(this, tr("Stammdaten hinzufügen"), tr("Der Titel wurde nicht zu den Stammdaten und zur aktuellen Remission hinzugefügt."));
                        ui->gtin_input->clear();
                        ui->gtin_input->setFocus();
                        return;
                    }
                }

                remitable->addRemi(gtin, addon, menge);
            }
        }
        ui->gtin_input->clear();
        checkAll();
    }
}

void Remi::check_delete()
{
    ui->delete_button->setEnabled( remitable->selectedItems().isEmpty()?false:true );
}

void Remi::archivieren()
{
    if ( db.isOpen() || db.open() )
    {
        QSqlQuery q(db);
        if ( remitable->getPaket(-1)->getRemiItems().count()>0 && !remitable->newPackage() )
        {
            return;
        }

        remitable->blockSignals(true);

        if ( q.exec("INSERT INTO `archiv` (`datetime`) VALUES ('" + QDateTime().currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") + "');") )
        {
            QSqlQuery("UPDATE `remission` SET `archiv_id` = '" + q.lastInsertId().toString() + "' WHERE `archiv_id` = '-1';", db);
        }

        remitable->blockSignals(false);

        checkAll();
        emit archiviert();
    }
}

void Remi::keyPressEvent(QKeyEvent *event)
{
    if ( event->key() == Qt::Key_Delete )
    {
        remitable->removeSelectedRemis();
    }
}
